#include <logbase.h>
// AI回答：对其为了提高程序执行效率，也跟硬件有关。
struct myDuiqiStruct
{
    uint8_t val1;  // 0
    uint16_t val2; // 2-3
    uint8_t val3;  // 4
    uint32_t val4; // 8-11
    uint64_t val5; // 16-23
    uint8_t val6;  // 24
    uint16_t val7; // 25-26. 27-31对其保留。
};

#if 1
// 取消对其两种方式
struct myDuiqiStruct1
{
    uint8_t val1;
    uint16_t val2;
    uint8_t val3;
    uint32_t val4;
    uint64_t val5;
    uint8_t val6;
    uint16_t val7;
} __attribute__((packed)); // 效果与#pragma pack(1)一致。
#else
#pragma pack(1)
struct myDuiqiStruct1
{
    uint8_t val1;
    uint16_t val2;
    uint8_t val3;
    uint32_t val4;
    uint64_t val5;
    uint8_t val6;
    uint16_t val7;
};
#pragma pack()
#endif
struct myDuiqiStruct2
{
    uint64_t val5;
    uint32_t val4;
    uint16_t val2;
    uint16_t val7;
    uint8_t val1;
    uint8_t val3;
    uint8_t val6;
};

// 结构体对其。
// 结构体以最大长度的基本数据类型进行对其。长度是最大基本数据长度的整数倍。
// 所有变量都是连续空间，包括数组。而指针分配的另算。
struct StudentInformStruct
{
    uint32_t id;     // 4字节，是结构体最大的基本数据，对其方式为4。占0、1、2、3字节。
    uint8_t age;     // 1字节，占第4字节。
    float height;    // 4字节，需要对其，5、6、7不能装下4字节，对其到8、9、10、11字节。（7、8、9位对其时多余的空间）
    uint16_t weight; // 两字节，放到12、13字节。
    // 下面是字符串数组，基本类型是1字节。可以放2个字节到14、15字节。
    // 4字节对其放到16、17、18、19.
    // 1字节，放到下个对其，20.
    char name[7]; // 用字符数组来保存名字。
    // 剩下21、22、23多余空间。
    /*

    */
};

#pragma pack(1) // 固定1字节对其。c99
// 无对其，直接计算多少自己即可。
struct StudentInformStruct1
{
    uint32_t id;     // 0、1、2、3
    uint8_t age;     // 4
    float height;    // 5、6、7、8
    uint16_t weight; // 9、10
    char name[7];    // 11、12、13、14、15、16、17
};
#pragma pack()

int main(int argc, char **argv)
{
    logdebugc("%d", (int)sizeof(struct myDuiqiStruct));
    logdebugc("%d", (int)sizeof(struct myDuiqiStruct1));
    logdebugc("%d", (int)sizeof(struct myDuiqiStruct2));
    {
        struct StudentInformStruct tmpstudent =
            {
                .id = 1, // c99
                .age = 18,
                .height = 165.3,
                .weight = 0x32,
                .name = "stud"};
        logdebugc("struct len=%lu", sizeof(tmpstudent));
        char *tmppointor = (char *)&tmpstudent;
        for (int i = 0; i < sizeof(tmpstudent); i++)
        {
            // 这里可以得出小端系统，
            // 浮点数有自己的保存格式。
            // 其中7、8、9、21、22、23是多余空间。
            logdebugc("0x%02x", (uint8_t)tmppointor[i]);
        }
    }

    {
        struct StudentInformStruct1 tmpstudent =
            {
                .id = 1,
                .age = 18,
                .height = 165.3,
                .weight = 0x32,
                .name = "stud"};
        logdebugc("struct len=%lu", sizeof(tmpstudent));
        char *tmppointor = (char *)&tmpstudent;
        for (int i = 0; i < sizeof(tmpstudent); i++)
        {
            // 这里可以得出小端系统，
            // 浮点数有字节的保存格式。
            logdebugc("0x%02x", (uint8_t)tmppointor[i]);
        }
    }

    return 1;
}
